package cn.tedu.tmall.front.mall.service.impl;

import cn.tedu.tmall.common.pojo.CurrentUser;
import cn.tedu.tmall.front.mall.dao.repository.ICartCacheRepository;
import cn.tedu.tmall.front.mall.pojo.po.CartPO;
import cn.tedu.tmall.front.mall.pojo.vo.CartVO;
import cn.tedu.tmall.front.mall.service.ICartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class CartServiceImpl implements ICartService {

    @Autowired
    private ICartCacheRepository cartCacheRepository;

    /**
     * 增加商品到购物车
     * @param user
     * @param goodsId
     * @param goodsNum
     */
    @Override
    public void add(CurrentUser user, Long goodsId, Integer goodsNum) {
        // 1 商品是否存在  从数据库或者redis查询,自己搞定
        // 2 商品是否上架  从数据库查询或者redis查询,自己搞定,
        //  商品数据是否可以放到redis里?  放到redis 结合使用
        //      1 商品的全量数据肯定要存到mysql
        //      2 为了提高性能 可以把商品放到redis 20的商品放到redis
        //      2 8 原则
        //    商品数量太多? 不是理由
        //    商品的数据不能丢? 不能
        //    谁能知道商品丢不丢? 谁发布的谁知道 商家应该知道
        //    取舍的问题 要高性能的查询,还是不允许商品丢失.(缓存一致性方案)
        // 3 加入车车  购物车的数据放到什么地方? 数据库还是redis?
        //      高读高写  数据可以接受丢失?
        //          数据库有个持久化的概念 redis 也有
        //      事务 ACID redis 和 mysql 的支持是不一样的

        CartPO cartPO = new CartPO();
        cartPO.setGoodsId(goodsId);
        cartPO.setGoodsNum(goodsNum);
        cartPO.setGoodsName("iphone160");
        cartPO.setChecked(1);
        //new Date ,LocalDateTime
        cartPO.setAddCartTime(System.currentTimeMillis());

        //真实价格 10.087
        //数据库存储 10.087 * 1000 10087
        //页面显示 10087/1000 10.087

        //真实价格 10.08
        //数据库存储 10.08 * 100 1008
        //页面显示 1008/100 10.08
        cartPO.setAddPrice(1008L); //真实价格 10.08
        cartCacheRepository.add(user.getId(),cartPO);
    }

    @Override
    public void incr(CurrentUser user, Long goodsId, Integer goodsNum) {

    }

    @Override
    public void reduce(CurrentUser user, Long goodsId, Integer goodsNum) {

    }

    @Override
    public List<CartVO> list(CurrentUser user) {
        List<CartPO> cartPOS = cartCacheRepository.list(user.getId());
        cartPOS.sort((o1, o2) -> {
            if (o1 != null && o1.getAddCartTime() != null
                    && o2 != null && o2.getAddCartTime() != null) {
                return o2.getAddCartTime().compareTo(o1.getAddCartTime());
            }
            return 0;
        });
        List<CartVO> result = new ArrayList<>();
        cartPOS.forEach(po -> {
            CartVO cartVO = new CartVO();
            BeanUtils.copyProperties(po, cartVO);
            result.add(cartVO);
        });
        //cartPOS.stream().sorted();
        //cartPOS.stream().sorted(new Comparator<CartPO>() {
        //    @Override
        //    public int compare(CartPO o1, CartPO o2) {
        //       return 0;
        //    }
        //});


        return result;
    }

    @Override
    public void del(CurrentUser user, Long goodsId) {
        cartCacheRepository.delByUserIdAndGoodsId(user.getId(),goodsId);
    }

    @Override
    public void pick(CurrentUser user, Long goodsId) {
        //1 判断商品id是否在购物车存在
        //2 商品是否上架
        //1 是魔数 我们建议定义为常量或者枚举
        // GOODS_CHECK_STATUS_ON = 1
        cartCacheRepository.updateCheckStatusByUserIdAndGoodsId(user.getId(),goodsId,1);

    }

    @Override
    public void modify(CurrentUser user, Long goodsId, Integer goodsNum) {
        cartCacheRepository.modify(user.getId(),goodsId,goodsNum);

    }

    @Override
    public void unPick(CurrentUser user, Long goodsId) {
        //1 判断商品id是否在购物车存在
        //2 商品是否上架
        //0 是魔数 我们建议定义为常量或者枚举
        //GOODS_CHECK_STATUS_OFF = 1
        cartCacheRepository.updateCheckStatusByUserIdAndGoodsId(user.getId(),goodsId,0);

    }
}

